package com.jml.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;

public class Server {
	public static void main(String[] args) throws Exception {
		//1 第一个线程组 是用于接收Client端连接的  NIO是专门针对于tcp协议的
		EventLoopGroup bossGroup = new NioEventLoopGroup();
		//2 第二个线程组 是用于实际的业务处理操作的
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		//3 创建一个辅助类Bootstrap，就是对我们的Server进行一系列的配置
		ServerBootstrap serverBootstrap = new ServerBootstrap();
		//把实例化好俩个工作线程组加入进来
		serverBootstrap.group(bossGroup, workerGroup)
		//我要指定使用NioServerSocketChannel这种类型的通道
		 .channel(NioServerSocketChannel.class)
		//一定要使用 childHandler 去绑定具体的事件处理器
		 .childHandler(new ChannelInitializer<SocketChannel>() {
			@Override
			protected void initChannel(SocketChannel sc) throws Exception {
				//pipeline相当于一个管道
				sc.pipeline().addLast(new ServerHandler());
			}
		});
		//绑定指定的端口 进行监听
		serverBootstrap.bind(8765)
				.sync()
				.channel()
				.closeFuture()
				.sync();
		//.closeFuture().sync()相当于Thread.sleep(1000000);
		//阻塞着，可以一直接受多个客户端，不会让main函数停止而客户端停止，防止主程序停止
		bossGroup.shutdownGracefully();
		workerGroup.shutdownGracefully();
	}
}
